// @strict-types

#Область ОписаниеПеременных

&НаКлиенте
Перем ФормаОбщегоНазначения Экспорт; //см. ОбработкаОбъект.УИ_МенеджерОтрытыхФорм.ФормаОбщегоНазначения

#КонецОбласти

#Область ОбработчикиСобытийФормы

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
	ЗаполнитьЗначенияСвойств(ЭтотОбъект, Параметры, "ВспомогательныеЗначения");
	
	ЗаполнитьДеревоДоступныхФорм();
	
КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытии(Отказ)
	
	ЗаполнитьЗначенияСвойств(ЭтотОбъект, ВладелецФормы, "ФормаОбщегоНазначения");
	
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовТаблицыФормыДоступныеФормы

&НаКлиенте
Процедура ДоступныеФормыВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)

	Если Элемент.ТекущиеДанные.ЭтоФорма Тогда
		ОткрытьВыбраннуюФорму();
	КонецЕсли;

КонецПроцедуры

#КонецОбласти

#Область ОбработчикиКомандФормы

&НаКлиенте
Процедура Команда_ОткрытьВыбраннуюФорму(Команда)
	
	ОткрытьВыбраннуюФорму();
	
КонецПроцедуры

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

&НаСервере
Процедура ЗаполнитьДеревоДоступныхФорм()
	
	КорневыеСтроки	= ДоступныеФормы.ПолучитьЭлементы();
	КорневыеСтроки.Очистить();
	
	НавигационныеСсылки = НовыйНавигационныеСсылки();
	 
	ЗаполнитьСистемныеФормы(КорневыеСтроки);
	
	ЗаполнитьИсториюРаботы(КорневыеСтроки, НавигационныеСсылки);
		
	ЗаполнитьИзбранное(КорневыеСтроки, НавигационныеСсылки);
	
	ЗаполнитьПредставлениеНавигационныхСсылок(КорневыеСтроки, НавигационныеСсылки);
	
	ЗаполнитьМетаданные(КорневыеСтроки, НавигационныеСсылки);
	
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьИсториюРаботы(КорневыеСтроки, НавигационныеСсылки)
	
	Вспомогательные = ВспомогательныеЗначения(ЭтотОбъект);
	
	СтрокаИстории = НовоеОписаниеДоступнойФормы(
		КорневыеСтроки, "ИсторияРаботы", "", 
		Вспомогательные.ИндексыКартинкиСтрокФорм.ИсторияРаботы);

	КоллекцияСтрокиИстории	= СтрокаИстории.ПолучитьЭлементы();
	
	Для Каждого ЭлементИсторииРаботыПользователя Из ИсторияРаботыПользователя.Получить() Цикл
		
		ТекущаяНавигационнаяСсылка	= ЭлементИсторииРаботыПользователя.НавигационнаяСсылка;
		Если НавигационныеСсылки.Получить(ТекущаяНавигационнаяСсылка) = Неопределено Тогда
			
			СтрокаТекущейСсылки	= НовоеОписаниеДоступнойФормы(
				КоллекцияСтрокиИстории, "", "", 
				СтрокаИстории.Картинка, "", ТекущаяНавигационнаяСсылка);
			ДобавитьВНавигационныеСсылки(НавигационныеСсылки, ТекущаяНавигационнаяСсылка, СтрокаТекущейСсылки);
			
		КонецЕсли;
		
	КонецЦикла;
	
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьИзбранное(КорневыеСтроки, НавигационныеСсылки)
	
	Вспомогательные = ВспомогательныеЗначения(ЭтотОбъект);
	
	ИзбранноеРаботыПользователя	= ХранилищеСистемныхНастроек.Загрузить("Общее/ИзбранноеРаботыПользователя");
	Если ТипЗнч(ИзбранноеРаботыПользователя) = Тип("ИзбранноеРаботыПользователя") Тогда
		
		СтрокаИзбранного = НовоеОписаниеДоступнойФормы(
			КорневыеСтроки, "Избранное", "", 
			Вспомогательные.ИндексыКартинкиСтрокФорм.Избранное);
			
		КоллекцияСтрокиИзбранного	= СтрокаИзбранного.ПолучитьЭлементы();
		Для Каждого ЭлементИзбранного Из ИзбранноеРаботыПользователя Цикл
			
			ТекущаяНавигационнаяСсылка	= ЭлементИзбранного.НавигационнаяСсылка;
			СтрокаТекущейСсылки			= НовоеОписаниеДоступнойФормы(КоллекцияСтрокиИзбранного, 
				ЭлементИзбранного.Представление, ЭлементИзбранного.Представление, 
				СтрокаИзбранного.Картинка, "", ТекущаяНавигационнаяСсылка);
			
			ДобавитьВНавигационныеСсылки(НавигационныеСсылки, ТекущаяНавигационнаяСсылка, СтрокаТекущейСсылки);
			
		КонецЦикла;
		
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьПредставлениеНавигационныхСсылок(КорневыеСтроки, НавигационныеСсылки)
	
	МассивСсылок	= Новый Массив; // Массив из Строка
	Для Каждого КлючИЗначение Из НавигационныеСсылки Цикл
		МассивСсылок.Добавить(КлючИЗначение.Ключ);
	КонецЦикла;
	ПредставленияСсылок	= ПолучитьПредставленияНавигационныхСсылок(МассивСсылок);
	Для Каждого ПредставлениеСсылки Из ПредставленияСсылок Цикл
		Для Каждого ТекущаяСтрока Из НавигационныеСсылки.Получить(ПредставлениеСсылки.НавигационнаяСсылка) Цикл
			ТекущаяСтрока.Синоним	= ПредставлениеСсылки.Текст;
		КонецЦикла;
	КонецЦикла;
	
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьМетаданные(КорневыеСтроки, НавигационныеСсылки)
	
	Вспомогательные = ВспомогательныеЗначения(ЭтотОбъект);
	
	Для Каждого КлючИЗначение Из МетаданныеЕдинственногоИМножественного() Цикл
		
		ИмяМетаданных	= КлючИЗначение.Значение;
		
		СтрокаТипаОбъектов	= НовоеОписаниеДоступнойФормы(КорневыеСтроки, ИмяМетаданных);
		Вспомогательные.ИндексыКартинкиСтрокФорм.Свойство(КлючИЗначение.Ключ, СтрокаТипаОбъектов.Картинка);
		
		КоллекцияСтрокОбъектов	= СтрокаТипаОбъектов.ПолучитьЭлементы();
		
		Для Каждого ТекущиеМетаданные Из Метаданные[ИмяМетаданных] Цикл //ОбъектМетаданных, ОбъектМетаданныхДокумент
			
			КоллекцияМетаданныхФорм	= Новый Массив; // Массив из ОбъектМетаданных
			Если ИмяМетаданных = "ОбщиеФормы" Тогда
				КоллекцияМетаданныхФорм.Добавить(ТекущиеМетаданные);
				СтрокаТекущегоОбъекта	= СтрокаТипаОбъектов;
			Иначе
				КоллекцияМетаданныхФорм	= ТекущиеМетаданные.Формы; // Массив из ОбъектМетаданных
				СтрокаТекущегоОбъекта	= НовоеОписаниеДоступнойФормы(КоллекцияСтрокОбъектов, 
				ТекущиеМетаданные.Имя, ТекущиеМетаданные.Синоним, СтрокаТипаОбъектов.Картинка);
			КонецЕсли;
			
			КоллекцияСтрокФорм	= СтрокаТекущегоОбъекта.ПолучитьЭлементы();
						
			Для Каждого МетаданныеФормы Из КоллекцияМетаданныхФорм Цикл
				
				Если НЕ МетаданныеФормы.ТипФормы = Метаданные.СвойстваОбъектов.ТипФормы.Управляемая Тогда
					Продолжить;
				КонецЕсли;
				
				ОписаниеФормы	= НовоеОписаниеДоступнойФормы(КоллекцияСтрокФорм);
				ЗаполнитьЗначенияСвойств(ОписаниеФормы, МетаданныеФормы);
				ОписаниеФормы.ПолноеИмя	= МетаданныеФормы.ПолноеИмя();
				ОписаниеФормы.ЭтоФорма	= Истина;
				
			КонецЦикла;
			
			Если КоллекцияСтрокФорм.Количество() = 0 Тогда
				КоллекцияСтрокОбъектов.Удалить(СтрокаТекущегоОбъекта);
			КонецЕсли;
			
		КонецЦикла;
		
	КонецЦикла;
	
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьСистемныеФормы(КорневыеСтроки)
	
	Вспомогательные = ВспомогательныеЗначения(ЭтотОбъект);
	
	ТекущийРодитель = НовоеОписаниеДоступнойФормы(
		КорневыеСтроки, "СистемныеФормы", "", 
		Вспомогательные.ИндексыКартинкиСтрокФорм.Системные);
		
	КоллекцияСтрок	= ТекущийРодитель.ПолучитьЭлементы();
	Для Каждого СистемнаяФорма Из Вспомогательные.СистемныеФормы Цикл
		
		НовоеОписаниеДоступнойФормы(КоллекцияСтрок, 
			СистемнаяФорма.Имя, СистемнаяФорма.Заголовок, 
			ТекущийРодитель.Картинка, "sysForm:" + СистемнаяФорма.Имя);
			
	КонецЦикла;
	
КонецПроцедуры

// Навигационные ссылки.
// 
// Возвращаемое значение:
//  Соответствие из КлючИЗначение:
//  * Ключ - Строка - Навигационная ссылка
//  * Значение - Массив из см. НовоеОписаниеДоступнойФормы
&НаСервере
Функция НовыйНавигационныеСсылки()
	
	Возврат Новый Соответствие;
	
КонецФункции

// Добавить в навигационные ссылки.
// 
// Параметры:
//  НавигационныеСсылки - см. НовыйНавигационныеСсылки
//  НавигационнаяСсылка - Строка
//  ОписаниеФормы - см. НовоеОписаниеДоступнойФормы
&НаСервере
Процедура ДобавитьВНавигационныеСсылки(НавигационныеСсылки, НавигационнаяСсылка, ОписаниеФормы)
	
	ДобавленныеОписания = НавигационныеСсылки.Получить(НавигационнаяСсылка);
	Если ДобавленныеОписания = Неопределено Тогда
		ДобавленныеОписания = Новый Массив; // Массив из см. НовоеОписаниеДоступнойФормы
		НавигационныеСсылки.Вставить(НавигационнаяСсылка, ДобавленныеОписания);
	КонецЕсли;
	
	ДобавленныеОписания.Добавить(ОписаниеФормы);
	
КонецПроцедуры

// @skip-check method-too-many-params
// 
// Параметры:
//  КоллекцияСтрок - ДанныеФормыКоллекцияЭлементовДерева
//  Имя - Произвольный, Строка - Имя
//  Синоним - Строка - Синоним
//  Картинка - Число - Картинка
//  ПолноеИмяФормы - Строка - Полное имя формы
//  НавигационнаяСсылка - Строка - Навигационная ссылка
// 
// Возвращаемое значение:
//  ДанныеФормыЭлементДерева:
//  * Имя - Строка
//  * Синоним - Строка
//  * Картинка - Число
//  * ПолноеИмя - Строка
//  * НавигационнаяСсылка - Строка
//  * ЭтоФорма - Булево
&НаСервереБезКонтекста
Функция НовоеОписаниеДоступнойФормы(КоллекцияСтрок, 
	Имя = "", Синоним = "", Картинка = 0, 
	ПолноеИмяФормы = "", НавигационнаяСсылка = "")
	
	НоваяСтрока = КоллекцияСтрок.Добавить();
	НоваяСтрока.Имя = Имя;
	НоваяСтрока.Синоним = ?(ПустаяСтрока(Синоним), Имя, Синоним);
	НоваяСтрока.Картинка = Картинка;
	НоваяСтрока.ПолноеИмя = ПолноеИмяФормы;
	НоваяСтрока.НавигационнаяСсылка	= НавигационнаяСсылка;
	
	НоваяСтрока.ЭтоФорма = ЗначениеЗаполнено(НоваяСтрока.ПолноеИмя) 
		ИЛИ ЗначениеЗаполнено(НоваяСтрока.НавигационнаяСсылка);
	
	Возврат НоваяСтрока;
	
КонецФункции

&НаКлиентеНаСервереБезКонтекста
Функция МетаданныеЕдинственногоИМножественного()
	
	Соответствие	= Новый Соответствие;
	Соответствие.Вставить("ОбщаяФорма"				, "ОбщиеФормы");
	Соответствие.Вставить("ПланОбмена"				, "ПланыОбмена");
	Соответствие.Вставить("Справочник"				, "Справочники");
	Соответствие.Вставить("Документ"				, "Документы");
	Соответствие.Вставить("ЖурналДокументов"		, "ЖурналыДокументов");
	Соответствие.Вставить("Перечисление"			, "Перечисления");
	Соответствие.Вставить("Отчет"					, "Отчеты");
	Соответствие.Вставить("Обработка"				, "Обработки");
	Соответствие.Вставить("ПланВидовХарактеристик"	, "ПланыВидовХарактеристик");
	Соответствие.Вставить("ПланСчетов"				, "ПланыСчетов");
	Соответствие.Вставить("ПланВидовРасчета"		, "ПланыВидовРасчета");
	Соответствие.Вставить("РегистрСведений"			, "РегистрыСведений");
	Соответствие.Вставить("РегистрНакопления"		, "РегистрыНакопления");
	Соответствие.Вставить("РегистрБухгалтерии"		, "РегистрыБухгалтерии");
	Соответствие.Вставить("РегистрРасчета"			, "РегистрыРасчета");
	Соответствие.Вставить("БизнесПроцесс"			, "БизнесПроцессы");
	Соответствие.Вставить("Задача"					, "Задачи");
	
	Возврат Соответствие;
	
КонецФункции

// Открыть выбранную форму конец.
// 
// Параметры:
//  ПараметрыОткрытия - см. ОбработкаОбъект.УИ_МенеджерОтрытыхФорм.НовыйРезультатРедактированияСтруктурыСоответствия
//  ДопПараметры - Неопределено, Структура -
&НаКлиенте
Процедура ОткрытьВыбраннуюФормуКонец(ПараметрыОткрытия = Неопределено, ДопПараметры = Неопределено) Экспорт
	
	ТекущиеДанные = Элементы.ДоступныеФормы.ТекущиеДанные;
	Если ТекущиеДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	ПараметрыЗакрытия = Новый Структура;
	ПараметрыЗакрытия.Вставить("ПолноеИмя", Неопределено);
	ПараметрыЗакрытия.Вставить("НавигационнаяСсылка", Неопределено);
	ПараметрыЗакрытия.Вставить("Параметры", Неопределено);
	ЗаполнитьЗначенияСвойств(ПараметрыЗакрытия, ТекущиеДанные);
	
	Если ТипЗнч(ПараметрыОткрытия) = Тип("Структура") 
		И ПараметрыОткрытия.Свойство("ЗначениеРеквизита") Тогда
		ПараметрыЗакрытия.Параметры = ПараметрыОткрытия.ЗначениеРеквизита;
	КонецЕсли;
	
	Закрыть(ПараметрыЗакрытия);
	
КонецПроцедуры

&НаКлиенте
Процедура ОткрытьВыбраннуюФорму()
	
	ТекущиеДанные = Элементы.ДоступныеФормы.ТекущиеДанные;
	Если ТекущиеДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Если ПустаяСтрока(ТекущиеДанные.ПолноеИмя) Тогда
		
		ОткрытьВыбраннуюФормуКонец();
		
	Иначе
		
		ПараметрыРедактора	= Новый Структура();
		ПараметрыРедактора.Вставить("РедактируемоеЗначение", Новый Структура);
		ПараметрыРедактора.Вставить("Заголовок", "Укажите параметры для открытия формы");
		
		ПолныйПутьКФорме = ПолныйПутьКФормеОбработки("РедакторСтруктурыСоответствия");
		
		ОткрытьФорму(ПолныйПутьКФорме, ПараметрыРедактора, ЭтотОбъект, , , , 
		Новый ОписаниеОповещения("ОткрытьВыбраннуюФормуКонец", ЭтотОбъект), РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
		
	КонецЕсли;
	
КонецПроцедуры

// см. ОбработкаОбъект.УИ_МенеджерОтрытыхФорм.ПолныйПутьКФормеОбработки
&НаКлиенте
Функция ПолныйПутьКФормеОбработки(ИмяФормыОбработки)
	
	//@skip-check dynamic-access-method-not-found, bsl-legacy-check-dynamic-feature-access
	Возврат ФормаОбщегоНазначения.ПолныйПутьКФормеОбработки(ИмяФормыОбработки);
	
КонецФункции

// Вспомогательные значения.
// 
// Параметры:
//  Форма - ФормаКлиентскогоПриложения:
//  * ВспомогательныеЗначения - см. ВспомогательныеЗначения
// 
// Возвращаемое значение:
//  см. ОбработкаОбъект.УИ_МенеджерОтрытыхФорм.НовыйВспомогательныеЗначения
&НаКлиентеНаСервереБезКонтекста
Функция ВспомогательныеЗначения(Форма)
	
	Возврат Форма.ВспомогательныеЗначения;
	
КонецФункции

#КонецОбласти
